package org.pupil.event;

import io.netty.channel.ChannelFuture;
import org.pupil.common.Cache;
import org.pupil.common.Host;
import org.pupil.common.Service;
import org.pupil.common.URL;

import java.util.ArrayList;

/**
 * @Description: 服务添加事件的监听执行器
 * @Author: pupil
 * @Date: 2024/07/10 下午 9:14
 */
public class AddRpcListener implements IRpcListener<AddRpcEventData> {

    @Override
    public void exec(AddRpcEventData addRpcEventData) {
        // 获取资源定位器
        final URL url = (URL) addRpcEventData.getData();
        // 获取服务名
        final Service serviceName = new Service(url.getServiceName(), url.getVersion());
        // 判读服务是否已经存在，不存在则创建新的服务添加到缓存中
        if (!Cache.SERVICE_URLS.containsKey(serviceName)) {
            Cache.SERVICE_URLS.put(serviceName, new ArrayList<>());
        }
        // 存在则添加新的客户端资源定位器
        Cache.SERVICE_URLS.get(serviceName).add(url);
        // 获取服务端的网络配置
        final Host host = new Host(url.getIP(), url.getPort());
        // 判断服务端的网络配置是否存在，不存在则根据服务端的网络配置和客户端建立连接并更新本地缓存
        if (!Cache.CHANNEL_FUTURE_MAP.containsKey(host)) {
            // 根据服务端的网络配置和客户端建立连接
            ChannelFuture channelFuture = Cache.BOOT_STRAP.connect(url.getIP(), url.getPort());
            // 更新本地缓存
            Cache.CHANNEL_FUTURE_MAP.put(host, channelFuture);
        }
    }
}
